#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

using namespace std;

void SetNonBlock(int fd)
{
    int mode = fcntl(fd,F_GETFL);
    if(mode < 0)
    {
        perror("fcntl");
        return;
    }

    fcntl(fd,F_SETFL,mode | O_NONBLOCK);
}

int main()
{
    SetNonBlock(0);

    while(1)
    {
        char buffer[1024] = {0};
        ssize_t n = read(0,buffer,sizeof(buffer)-1);

        if(n > 0)
        {
            buffer[n] = 0;
            cout << "echo : " << buffer << endl;
        }
        else if(n == 0)
        {
            cout << "end stdin" << endl;
            break;
        }
        else
        {
            if(errno == O_NONBLOCK || errno == EAGAIN)
            {
                cout << "The data is not ready yet , errno : " << errno << endl;
                // 干其他事
            }
            else if(errno == EINTR)
            {
                // 进程在进行IO的时候，可能会因为信号机制，导致IO直接返回
                // 这时函数的返回值也是-1，并会将errno 设置为 EINTR
                // 这种情况也不算是读取错误
                cout << "IO interpreted by signal , try again" << endl;
            }
            else
            {
                cout << "read error" << endl;
                break;
            }
        }

        sleep(1);
    }

    return 0;
}